local key = KEYS[1]
local member = KEYS[2]

local window_size = tonumber(ARGV[1])
local limit = tonumber(ARGV[2])
local timestamp = tonumber(ARGV[3])

local accepted = 0
local exists_key = redis.call('exists', key) -- 查看key是否存在，1：存在 0：不存在

-- 如果存在key，则统计集合中元素的个数
if (exists_key == 1) then
    accepted = redis.call('zcard', key)
end

-- 如果元素总数小于限流limit，则直接添加即可
if (accepted < limit) then
    redis.call('zadd', key, timestamp, member) -- 以timestamp作为score
end

-- 移除超出窗口期的元素，0 <= score <= (timestamp - window_size)
redis.call('zremrangebyscore', key, 0, timestamp - window_size)
redis.call('expire', key, window_size) -- 设置key在window_size秒后过期

local remain = limit - accepted -- 还可以添加的元素个数（remain = 限制元素数量 - 已存在元素数量）

local ttl = redis.call('ttl', key) -- 查看key的过期剩余时间
return { key, ttl, remain } -- 返回集合的主键值(key)、过期剩余时间(ttl)、还可以添加的元素个数(remain)